package com.mezz.bones.framework.elasticsearch.demo.document;

import lombok.Data;
import org.dromara.easyes.annotation.*;
import org.dromara.easyes.annotation.rely.Analyzer;
import org.dromara.easyes.annotation.rely.FieldStrategy;
import org.dromara.easyes.annotation.rely.FieldType;
import org.dromara.easyes.annotation.rely.IdType;

@IndexName(value = "demo_doc",keepGlobalPrefix = true)
@Data
public class DemoDocument {

    @IndexId(type = IdType.CUSTOMIZE)
    private String id;

    // 此处省略其它字段...

    // 场景一:标记es中不存在的字段
    @IndexField(exist = false)
    private String notExistsField;

    // 场景二:更新时,此字段非空字符串才会被更新 fieldType不知道默认是 KEYWORD_TEXT
    @IndexField(strategy = FieldStrategy.NOT_EMPTY)
    private String creator;

    // 场景三: 指定fieldData
    @IndexField(fieldType = FieldType.TEXT, fieldData = true)
    private String filedData;

    // 场景四:自定义字段名
    @IndexField("wu-laa")
    private String ula;

    /**
     * 入参日期格式类型
     * 返回值
     */
    // 场景五:支持日期字段在es索引中的format类型
    @IndexField(fieldType = FieldType.DATE, dateFormat = "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis")
    private String gmtCreate;

    /**
     * analyzer：在索引数据存储时使用的分词器，定义了如何处理字段值。 一般存储有意义分次 小米手机[IK_SMART] → [小米,手机]
     * searchAnalyzer：在查询时使用的分词器，定义了如何处理查询词。 一般尝试匹配更多词条 小米手机[IK_MAX_WORD] → ["小米", "米", "手机"]
     */
    // 场景六:支持指定字段在es索引中的分词器类型
    @IndexField(fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART, searchAnalyzer = Analyzer.IK_MAX_WORD)
    private String content;

    // 场景七：支持指定字段在es的索引中忽略大小写,以便在term查询时不区分大小写,仅对keyword类型字段生效,es的规则,并非框架限制.
    @IndexField(fieldType = FieldType.KEYWORD, ignoreCase = true)
    private String caseTest;

    // 场景八:支持稠密向量类型 稠密向量类型,dims必须同时指定,非负 最大为2048
    @IndexField(fieldType = FieldType.DENSE_VECTOR, dims = 3)
    private double[] vector;

    /**
     * 复合字段,此注解和SpringData中的MultiField用法类似 适用于对同一个字段通过多种分词器检索的场景
     */
    @MultiIndexField(mainIndexField = @IndexField(fieldType = FieldType.TEXT),
            otherIndexFields = {@InnerIndexField(suffix = "zh", fieldType = FieldType.TEXT, analyzer = Analyzer.IK_SMART),
                    @InnerIndexField(suffix = "pinyin", fieldType = FieldType.TEXT, analyzer = Analyzer.PINYIN)})
    private String multiField;

    @Score
    private float score;
}
